package com.qiantu.api.db;

import android.content.Context;
import android.text.TextUtils;
import android.util.Log;

import com.qiantu.api.db.database.LocalDataBase;
import com.qiantu.api.db.greendao.DeviceBeanDao;
import com.qiantu.api.entity.DeviceBean;
import com.qiantu.api.entity.SceneBean;
import com.qiantu.api.db.greendao.SceneBeanDao;
import com.qiantu.api.entity.SceneDetailBean;

import org.greenrobot.greendao.query.QueryBuilder;

import java.util.List;

/**
 * Created by cjc on 2019/5/7
 */
public class LLSceneDBManager {

    private final String TAG = "LLSceneDBManager";
    private volatile static LLSceneDBManager instance = null;
    private final static Object object = new Object();
    private final SceneBeanDao mSceneBeanDao;
    private Context context;

    private LLSceneDBManager(Context context) {
        this.context = context;
        mSceneBeanDao = LocalDataBase.getInstance().getDaoSession(context).getSceneBeanDao();
    }

    public static LLSceneDBManager getInstance(Context context) {
        if (instance == null) {
            synchronized (object) {
                if (instance == null) {
                    instance = new LLSceneDBManager(context.getApplicationContext());
                }
            }
        }
        return instance;
    }

    public void clearFromDB() {
        mSceneBeanDao.deleteAll();
    }

    /**
     * 从服务器更新场景数据
     *
     * @param sceneList
     */
    public void putInTx(List<SceneBean> sceneList, HandleListener listener) {
        LocalDataBase.getInstance().getDaoSession(context).runInTx(() -> {
            for (SceneBean scene : sceneList) {
                put(scene);
            }
            listener.onCompleted();
        });
    }

    /**
     * 从服务器更新场景数据
     *
     * @param sceneList
     */
    public void refreshAllScenesTx(List<SceneBean> sceneList, HandleListener listener) {
        LocalDataBase.getInstance().getDaoSession(context).runInTx(() -> {
            clearFromDB();
            if(sceneList == null){
                return;
            }
            Log.i("lzxzx", "refreshAllScenesTx:" + sceneList.size());
            for (SceneBean scene : sceneList) {
                mSceneBeanDao.save(scene);
            }
        });
    }


    /**
     * 保存或者更新设备
     *
     * @param scene
     */
    public void put(SceneBean scene) {
        if (scene == null)
            return;
        String serialNo = scene.getSceneSerialNo();
        if (serialNo != null && !TextUtils.isEmpty(serialNo)) {
            SceneBean oldScene = mSceneBeanDao.queryBuilder()
                    .where(SceneBeanDao.Properties.SceneSerialNo.eq(serialNo))
                    .unique();
            if (oldScene != null) {
                scene.setId(oldScene.getId());
            }
        }
        mSceneBeanDao.save(scene);
    }

    /**
     * 通过serialNo获取房间
     *
     * @param serialNo
     * @return
     */
    public SceneBean getSceneBySerialNo(String serialNo) {
        return mSceneBeanDao.queryBuilder().where(SceneBeanDao.Properties.SceneSerialNo.eq(serialNo)).unique();
    }

    public void update(SceneDetailBean data) {
        if(TextUtils.isEmpty(data.getSceneSerialNo())){
            return;
        }
        SceneBean scene = getSceneBySerialNo(data.getSceneSerialNo());
        if(scene != null){
            scene.setName(data.getName());
            scene.setImage(data.getImage());
            scene.setIsFavourite(data.getFavourite());
            scene.setIsHide(data.getHide());
            scene.setLinkType(data.getLinkType());
            scene.setLinkType(data.getLinkType());
            scene.setRoomName(data.getRoomName());
            scene.setRoomSerialNo(data.getRoomSerialNo());
            mSceneBeanDao.save(scene);
        }
        return ;
    }

    /**
     * 删除场景
     *
     * @param scene
     */
    public void remove(SceneBean scene) {
        if (scene == null)
            return;
        SceneBean oldDevice = mSceneBeanDao.queryBuilder()
                .where(SceneBeanDao.Properties.SceneSerialNo.eq(scene.getSceneSerialNo()))
                .unique();
        if (oldDevice != null) {
            mSceneBeanDao.delete(oldDevice);
        }
    }

    public void remove(String serialNo) {
        SceneBean oldDevice = mSceneBeanDao.queryBuilder()
                .where(SceneBeanDao.Properties.SceneSerialNo.eq(serialNo))
                .unique();
        if (oldDevice != null) {
            mSceneBeanDao.delete(oldDevice);
        }
    }


    /**
     * 获得本地所有场景图片列表
     *
     * @return
     */
    public List<SceneBean> getAll() {
        return mSceneBeanDao.queryBuilder()
                .whereOr(SceneBeanDao.Properties.BingSceneSerialNo.eq(""), SceneBeanDao.Properties.BingSceneSerialNo.isNull())
                .orderAsc(SceneBeanDao.Properties.Sort)
                .orderDesc(SceneBeanDao.Properties.CreateTime)
                .list();
    }

    public List<SceneBean> getHouseAll() {
        return mSceneBeanDao.queryBuilder()
                .whereOr(SceneBeanDao.Properties.BingSceneSerialNo.eq(""), SceneBeanDao.Properties.BingSceneSerialNo.isNull())
                .orderAsc(SceneBeanDao.Properties.FloorGlobalSort)
                .orderDesc(SceneBeanDao.Properties.CreateTime)
                .list();
    }

    public List<SceneBean> getCommonScenes() {
        QueryBuilder<SceneBean> queryBuilder = mSceneBeanDao.queryBuilder();
        queryBuilder.whereOr(SceneBeanDao.Properties.LinkType.eq(2),SceneBeanDao.Properties.LinkType.eq(0));
        return queryBuilder.orderAsc(SceneBeanDao.Properties.Sort)
                .orderDesc(SceneBeanDao.Properties.CreateTime)
                .list();
    }

    public int getCommonSceneSize() {
        return (int) mSceneBeanDao.queryBuilder()
                .where(SceneBeanDao.Properties.LinkType.eq(2))
                .count();
    }

    public List<SceneBean> getScenesForRoomSerialNos(List<String> roomSerialNos) {
        QueryBuilder<SceneBean> queryBuilder = mSceneBeanDao.queryBuilder();
        queryBuilder.where(SceneBeanDao.Properties.RoomSerialNo.in(roomSerialNos));
        queryBuilder.whereOr(SceneBeanDao.Properties.BingSceneSerialNo.eq(""), SceneBeanDao.Properties.BingSceneSerialNo.isNull());
        return queryBuilder.orderAsc(SceneBeanDao.Properties.Sort)
                .orderDesc(SceneBeanDao.Properties.CreateTime)
                .list();
    }

    public List<SceneBean> getScenesForFloorSerialNos(List<String> roomSerialNos) {
        QueryBuilder<SceneBean> queryBuilder = mSceneBeanDao.queryBuilder();
        queryBuilder.where(SceneBeanDao.Properties.FloorSerialNo.in(roomSerialNos));
        queryBuilder.whereOr(SceneBeanDao.Properties.BingSceneSerialNo.eq(""), SceneBeanDao.Properties.BingSceneSerialNo.isNull());
        return queryBuilder.orderAsc(SceneBeanDao.Properties.Sort)
                .orderDesc(SceneBeanDao.Properties.CreateTime)
                .list();
    }

    public List<SceneBean> getScenesIntentBySerialNo(String sceneSerialNo) {
        if(TextUtils.isEmpty(sceneSerialNo)){
            return null;
        }
        return mSceneBeanDao.queryBuilder()
                .where(SceneBeanDao.Properties.BingSceneSerialNo.eq(sceneSerialNo), SceneBeanDao.Properties.SceneType.eq(3))
                .orderAsc(SceneBeanDao.Properties.Sort)
                .orderAsc(SceneBeanDao.Properties.CreateTime)
                .list();
    }

    public SceneBean getScenesPrivateBySerialNo(String sceneSerialNo, String createUserSerialNo) {
        if(TextUtils.isEmpty(sceneSerialNo)){
            return null;
        }
        return mSceneBeanDao.queryBuilder()
                .where(SceneBeanDao.Properties.BingSceneSerialNo.eq(sceneSerialNo), SceneBeanDao.Properties.SceneType.eq(4))
                .orderAsc(SceneBeanDao.Properties.Sort)
                .orderDesc(SceneBeanDao.Properties.CreateTime)
                .unique();
    }

    /**
     * 获得本地场景
     *
     * @return
     */
    public List<SceneBean> getFavouriteScenes() {
        QueryBuilder<SceneBean> queryBuilder = mSceneBeanDao.queryBuilder();
        queryBuilder.where(SceneBeanDao.Properties.IsFavourite.eq(true));
        queryBuilder.whereOr(SceneBeanDao.Properties.BingSceneSerialNo.eq(""), SceneBeanDao.Properties.BingSceneSerialNo.isNull());
        return queryBuilder.orderAsc(SceneBeanDao.Properties.Sort)
                .orderDesc(SceneBeanDao.Properties.CreateTime)
                .list();
    }

    /**
     * 获得本地常用场景数量
     *
     * @return
     */
    public long getFavouriteSceneCount() {
        return mSceneBeanDao.queryBuilder()
                .where(SceneBeanDao.Properties.IsFavourite.eq(true))
                .count();
    }

    /**
     *  获得本地房间场景
     *
     * @return
     */
    public List<SceneBean> getSceneByRoom(String roomSerialNo) {
        QueryBuilder<SceneBean> queryBuilder = mSceneBeanDao.queryBuilder();
        queryBuilder.where(SceneBeanDao.Properties.RoomSerialNo.eq(roomSerialNo));
        queryBuilder.where(SceneBeanDao.Properties.LinkType.eq(1));
        queryBuilder.whereOr(SceneBeanDao.Properties.BingSceneSerialNo.eq(""), SceneBeanDao.Properties.BingSceneSerialNo.isNull());
        return queryBuilder.orderAsc(SceneBeanDao.Properties.RoomSort)
                .orderDesc(SceneBeanDao.Properties.CreateTime)
                .list();
    }

    public List<SceneBean> getSceneByFloor(String roomSerialNo) {
        QueryBuilder<SceneBean> queryBuilder = mSceneBeanDao.queryBuilder();
        queryBuilder.where(SceneBeanDao.Properties.FloorSerialNo.eq(roomSerialNo),SceneBeanDao.Properties.SceneType.eq(1));
        queryBuilder.whereOr(SceneBeanDao.Properties.BingSceneSerialNo.eq(""), SceneBeanDao.Properties.BingSceneSerialNo.isNull(),SceneBeanDao.Properties.LinkType.eq(1),SceneBeanDao.Properties.LinkType.eq(3));
        return queryBuilder.orderAsc(SceneBeanDao.Properties.FloorSort)
                .orderDesc(SceneBeanDao.Properties.CreateTime)
                .list();
    }
    /**
     * 获得本地房间下场景数量
     *
     * @return
     */
    public int getSceneSizeByRoom(String roomSerialNo) {
        return (int) mSceneBeanDao.queryBuilder()
                .where(SceneBeanDao.Properties.RoomSerialNo.eq(roomSerialNo))
                .where(SceneBeanDao.Properties.SceneType.eq(1))
                .count();
    }

    /**
     * 获得场景信息
     *
     * @return
     */
    public SceneBean get(String serialNo) {
        return mSceneBeanDao.queryBuilder()
                .where(SceneBeanDao.Properties.SceneSerialNo.eq(serialNo))
                .unique();
    }

    public void updateExpireTime(String serialNo, String date) {
        if (!TextUtils.isEmpty(serialNo)) {
            SceneBean sceneBean = mSceneBeanDao.queryBuilder()
                    .where(SceneBeanDao.Properties.SceneSerialNo.eq(serialNo))
                    .unique();
            if (sceneBean != null) {
                sceneBean.setActionSettingExpireTime(date);
                mSceneBeanDao.save(sceneBean);
            }
        }
    }
}
